package thread.nio.base;

import java.nio.ByteBuffer;

/**
 * Buffer中的三个重要参数
 * 
 * 								写模式				
 * 1.position 		当前缓冲区的位置,将从position下一个位置写数据
 * 								读模式
 * 					当前缓冲区读取的位置,将从此位置开始,读取数据
 * 
 * 							 写模式/读模式
 * 2.capacity				缓冲区的总容量上限

 * 3.limit						 写模式	
 * 				缓冲区的实际上限,它总是小于等于容量.通常情况下和容量相等
 * 								读模式
 * 					代表可读取的总容量,和上次写入的数据量相等
 *
 */
public class BufferTest {
	
	public static void main(String[] args) {
		ByteBuffer b = ByteBuffer.allocate(15);//15个字节的缓冲区
		System.out.println("limit=" + b.limit() + ";capacity=" +b.capacity()+";position="+b.position());
		//存放十个字节
		for(int i=0;i<10;i++){
			b.put((byte)i);
		}
		System.out.println("limit=" + b.limit() + ";capacity=" +b.capacity()+";position="+b.position());
		
		//重置position,limit改成当前position,常用来读写转换
		b.flip();
		System.out.println("limit=" + b.limit() + ";capacity=" +b.capacity()+";position="+b.position());
		//获取缓冲数据
		for(int i=0;i<10;i++){
			System.out.println(b.get());
		}
		System.out.println();
		//查看位置
		System.out.println("limit=" + b.limit() + ";capacity=" +b.capacity()+";position="+b.position());
		
		b.flip();
		System.out.println("limit=" + b.limit() + ";capacity=" +b.capacity()+";position="+b.position());
		
		//将position清空
		b.rewind();
		System.out.println("limit=" + b.limit() + ";capacity=" +b.capacity()+";position="+b.position());
		
		//将position清空,同事limit为capacity大小
		b.clear();
		System.out.println("limit=" + b.limit() + ";capacity=" +b.capacity()+";position="+b.position());
	}
}
